<?php

namespace App\Admin\Traits;

trait ReponseJson
{
    public static $HTTP_CONTINUE                        = 100;
    public static $HTTP_SWITCHING_PROTOCOLS             = 101;
    public static $HTTP_PROCESSING                      = 102; // RFC2518
    public static $HTTP_EARLY_HINTS                     = 103; // RFC8297
    public static $HTTP_OK                              = 200;
    public static $HTTP_CREATED                         = 201;
    public static $HTTP_ACCEPTED                        = 202;
    public static $HTTP_NON_AUTHORITATIVE_INFORMATION   = 203;
    public static $HTTP_NO_CONTENT                      = 204;
    public static $HTTP_RESET_CONTENT                   = 205;
    public static $HTTP_PARTIAL_CONTENT                 = 206;
    public static $HTTP_MULTI_STATUS                    = 207; // RFC4918
    public static $HTTP_ALREADY_REPORTED                = 208; // RFC5842
    public static $HTTP_IM_USED                         = 226; // RFC3229
    public static $HTTP_MULTIPLE_CHOICES                = 300;
    public static $HTTP_MOVED_PERMANENTLY               = 301;
    public static $HTTP_FOUND                           = 302;
    public static $HTTP_SEE_OTHER                       = 303;
    public static $HTTP_NOT_MODIFIED                    = 304;
    public static $HTTP_USE_PROXY                       = 305;
    public static $HTTP_RESERVED                        = 306;
    public static $HTTP_TEMPORARY_REDIRECT              = 307;
    public static $HTTP_PERMANENTLY_REDIRECT            = 308; // RFC7238
    public static $HTTP_BAD_REQUEST                     = 400;
    public static $HTTP_UNAUTHORIZED                    = 401;
    public static $HTTP_PAYMENT_REQUIRED                = 402;
    public static $HTTP_FORBIDDEN                       = 403;
    public static $HTTP_NOT_FOUND                       = 404;
    public static $HTTP_METHOD_NOT_ALLOWED              = 405;
    public static $HTTP_NOT_ACCEPTABLE                  = 406;
    public static $HTTP_PROXY_AUTHENTICATION_REQUIRED   = 407;
    public static $HTTP_REQUEST_TIMEOUT                 = 408;
    public static $HTTP_CONFLICT                        = 409;
    public static $HTTP_GONE                            = 410;
    public static $HTTP_LENGTH_REQUIRED                 = 411;
    public static $HTTP_PRECONDITION_FAILED             = 412;
    public static $HTTP_REQUEST_ENTITY_TOO_LARGE        = 413;
    public static $HTTP_REQUEST_URI_TOO_LONG            = 414;
    public static $HTTP_UNSUPPORTED_MEDIA_TYPE          = 415;
    public static $HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    public static $HTTP_EXPECTATION_FAILED              = 417;
    public static $HTTP_I_AM_A_TEAPOT                   = 418; // RFC2324
    public static $HTTP_MISDIRECTED_REQUEST             = 421; // RFC7540
    public static $HTTP_UNPROCESSABLE_ENTITY            = 422; // RFC4918
    public static $HTTP_LOCKED                          = 423; // RFC4918
    public static $HTTP_FAILED_DEPENDENCY               = 424; // RFC4918

    /**
     * @deprecated
     */
    public static $HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425; // RFC2817
    public static $HTTP_TOO_EARLY                                                 = 425; // RFC-ietf-httpbis-replay-04
    public static $HTTP_UPGRADE_REQUIRED                                          = 426; // RFC2817
    public static $HTTP_PRECONDITION_REQUIRED                                     = 428; // RFC6585
    public static $HTTP_TOO_MANY_REQUESTS                                         = 429; // RFC6585
    public static $HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE                           = 431; // RFC6585
    public static $HTTP_UNAVAILABLE_FOR_LEGAL_REASONS                             = 451;
    public static $HTTP_INTERNAL_SERVER_ERROR                                     = 500;
    public static $HTTP_NOT_IMPLEMENTED                                           = 501;
    public static $HTTP_BAD_GATEWAY                                               = 502;
    public static $HTTP_SERVICE_UNAVAILABLE                                       = 503;
    public static $HTTP_GATEWAY_TIMEOUT                                           = 504;
    public static $HTTP_VERSION_NOT_SUPPORTED                                     = 505;
    public static $HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL                      = 506; // RFC2295
    public static $HTTP_INSUFFICIENT_STORAGE                                      = 507; // RFC4918
    public static $HTTP_LOOP_DETECTED                                             = 508; // RFC5842
    public static $HTTP_NOT_EXTENDED                                              = 510; // RFC2774
    public static $HTTP_NETWORK_AUTHENTICATION_REQUIRED                           = 511; // RFC6585

    /**
     * Status codes translation table.
     *
     * The list of codes is complete according to the
     * {@link http://www.iana.org/assignments/http-status-codes/ Hypertext Transfer Protocol (HTTP) Status Code
     * Registry}
     * (last updated 2016-03-01).
     *
     * Unless otherwise noted, the status code is defined in RFC2616.
     *
     * @var array
     */
    public static $statusTexts = [
        100 => 'Continue',
        101 => 'Switching Protocols',
        102 => 'Processing', // RFC2518
        103 => 'Early Hints',
        200 => 'OK',
        201 => 'Created',
        202 => 'Accepted',
        203 => 'Non-Authoritative Information',
        204 => 'No Content',
        205 => 'Reset Content',
        206 => 'Partial Content',
        207 => 'Multi-Status', // RFC4918
        208 => 'Already Reported', // RFC5842
        226 => 'IM Used', // RFC3229
        300 => 'Multiple Choices',
        301 => 'Moved Permanently',
        302 => 'Found',
        303 => 'See Other',
        304 => 'Not Modified',
        305 => 'Use Proxy',
        307 => 'Temporary Redirect',
        308 => 'Permanent Redirect', // RFC7238
        400 => 'Bad Request',
        401 => 'Unauthorized',
        402 => 'Payment Required',
        403 => 'Forbidden',
        404 => 'Not Found',
        405 => 'Method Not Allowed',
        406 => 'Not Acceptable',
        407 => 'Proxy Authentication Required',
        408 => 'Request Timeout',
        409 => 'Conflict',
        410 => 'Gone',
        411 => 'Length Required',
        412 => 'Precondition Failed',
        413 => 'Payload Too Large',
        414 => 'URI Too Long',
        415 => 'Unsupported Media Type',
        416 => 'Range Not Satisfiable',
        417 => 'Expectation Failed',
        418 => 'I\'m a teapot', // RFC2324
        421 => 'Misdirected Request', // RFC7540
        422 => 'Unprocessable Entity', // RFC4918
        423 => 'Locked', // RFC4918
        424 => 'Failed Dependency', // RFC4918
        425 => 'Too Early', // RFC-ietf-httpbis-replay-04
        426 => 'Upgrade Required', // RFC2817
        428 => 'Precondition Required', // RFC6585
        429 => 'Too Many Requests', // RFC6585
        431 => 'Request Header Fields Too Large', // RFC6585
        451 => 'Unavailable For Legal Reasons', // RFC7725
        500 => 'Internal Server Error',
        501 => 'Not Implemented',
        502 => 'Bad Gateway',
        503 => 'Service Unavailable',
        504 => 'Gateway Timeout',
        505 => 'HTTP Version Not Supported',
        506 => 'Variant Also Negotiates', // RFC2295
        507 => 'Insufficient Storage', // RFC4918
        508 => 'Loop Detected', // RFC5842
        510 => 'Not Extended', // RFC2774
        511 => 'Network Authentication Required', // RFC6585
    ];

    /**
     * return success json
     */
    public function success($message = '', $data = [], $code = 200, $jump = '', $header = [], $httpCode = 200)
    {
        $return = [
            'status'  => 1,
            'message' => $message ?: 'success',
            'code'    => $code ?: 200,
            'data'    => $data,
            'jump'    => $jump ?: request()->server('HTTP_REFERER') ?? '',
        ];

        if (request()->expectsJson()) {
            return response()->json($return, $httpCode, $header);
        }

        return view('admin.public.success', [
            'message' => $message,
            'jump'    => $return['jump'],
            'data'    => $return,
        ]);
    }

    /**
     * return failure json
     */
    public function failure($message = '', $data = [], $code = 0, $jump = '', $header = [], $httpCode = 200)
    {
        $return = [
            'status'  => 0,
            'message' => $message ?: 'failure',
            'data'    => $data,
            'code'    => $code ?: 0,
            'jump'    => $jump ?: request()->server('HTTP_REFERER') ?? '',
        ];

        if (request()->expectsJson()) {
            return response()->json($return, $httpCode, $header);
        }

        return view('admin.public.exception', [
            'message' => $message,
            'code'    => $code,
            'jump'    => $return['jump'],
            'data'    => $return,
        ]);
    }

    /**
     * return layui table element
     */
    public function laytable($count, $data = [], $code = 0, $msg = '')
    {
        return [
            'code'  => $code,
            'msg'   => $msg,
            'count' => $count,
            'data'  => $data,
        ];
    }
}
